import { Injectable } from '@angular/core';
import { CanActivate, CanActivateChild, Router, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { AuthService } from './auth-service';

@Injectable()
export class AuthGuard implements CanActivate, CanActivateChild {
    constructor(private authService: AuthService,
        private router: Router) { }

    // ActivatedRouteSnapshot包含了即将被激活的路由，而RouterStateSnapshot包含了该应用即将到达的状态。
    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
        console.log('AuthGuard#canActivate called');
        const url = state.url;

        return this.checkLogin(url);
    }

    canActivateChild(childRoute: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
        throw new Error('Method not implemented.');
    }


    private checkLogin(url: string): boolean {
        // 如果用户还没有登录，我们会用RouterStateSnapshot.url保存用户来自的URL并让路由
        // 器导航到登录页（我们尚未创建该页）。 这间接导致路由器自动中止了这次导航，
        if (this.authService.isLoggedIn) { return true; }

        // store the attempted URL for redirecting
        this.authService.redirectUrl = url;

        // navigate to the login page with extras.
        this.router.navigate(['/login']);

        // checkLogin()返回false并不是必须的，但这样可以更清楚的表达意图。
        return false;
    }
}
